package main

import "fmt"

func main() {
    // Go 语言是静态类型语言，在编译时会检查变量的类型。

    // --- 变量声明 ---

    // 1. 使用 var 关键字声明变量，可以指定类型。
    // 如果没有初始化，变量会被赋予其类型的 "零值"。
    // int 的零值是 0, string 的零值是 "", bool 的零值是 false。
    var a int
    var s string
    fmt.Println("var a int (零值):", a)
    fmt.Println("var s string (零值):", s)

    // 2. 声明并初始化
    var b int = 10
    var t string = "hello"
    fmt.Println("var b int = 10:", b)
    fmt.Println("var t string = \"hello\":", t)

    // 3. 类型推断
    // Go 可以根据初始值自动推断变量的类型。
    var c = 20
    var u = "world"
    fmt.Printf("var c = 20 (类型: %T): %v\n", c, c)
    fmt.Printf("var u = \"world\" (类型: %T): %v\n", u, u)

    // 4. 短变量声明 (:=)
    // 这是最常用的方式，只能在函数内部使用。
    // 它会自动推断类型并初始化。
    d := 30
    v := "golang"
    fmt.Printf("d := 30 (类型: %T): %v\n", d, d)
    fmt.Printf("v := \"golang\" (类型: %T): %v\n", v, v)


    // --- 基本数据类型 ---

    // 布尔型 (bool)
    var isTrue bool = true
    fmt.Printf("isTrue (类型: %T): %v\n", isTrue, isTrue)

    // 整型 (int, int8, int16, int32, int64, uint, ...)
    var integer int = 100
    fmt.Printf("integer (类型: %T): %v\n", integer, integer)

    // 浮点型 (float32, float64)
    var pi float64 = 3.14159
    fmt.Printf("pi (类型: %T): %v\n", pi, pi)

    // 字符串 (string)
    // 字符串是不可变的字节序列。
    var message string = "学习 Go 语言"
    fmt.Printf("message (类型: %T): %v\n", message, message)

    // 常量 (const)
    // 常量的值在编译时就已经确定，不能被修改。
    const World = "世界"
    fmt.Println("Hello,", World)
}